package com.hyronjs.jiangbiao.antrus.forms;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;


import android.widget.EditText;

import com.hyronjs.jiangbiao.antrus.controller.BaseController;

/**
 * 自动将画面上的输入值保存在Form中
 * 
 * @author jiangbiao
 * 
 */
public class FormsFactory {

	public static Form createForms(BaseController controller ) {

		String formName = controller.getClass().getName().replace("Controller", "Form");
		Class form = null;
		Form result = null;
		try {
			form =  Class.forName(formName);
			result =  (Form) form.newInstance();
			Method[] ms = form.getMethods();
			for (int i = 0; i < ms.length; i++) {
				String name = ms[i].getName();
				if (name.startsWith("set")) {
					// Set方法的参数名
					Class[] cc = ms[i].getParameterTypes();
					if (cc.length == 1) {
						// parameter type
						String type = cc[0].getName();
						try {
							// 截取SetXXX中的XXX
							String prop = Character.toLowerCase(name.charAt(3))
									+ name.substring(4);
							// 从Map中取得应该被塞入的值
							// ××××前提是该值的属性名在xml中和在Bean中是完全一样的！！！！！

							String param = getValueFromXML(prop,controller);

							if (param != null && !param.equals("")) {
								// ms.setAccessible(true);
								if (type.equals("java.lang.String")) {
									ms[i].invoke(result, new Object[] { param });
								} else if (type.equals("int")
										|| type.equals("java.lang.Integer")) {
									ms[i].invoke(result,
											new Object[] { new Integer(param) });
								} else if (type.equals("long")
										|| type.equals("java.lang.Long")) {
									ms[i].invoke(result, new Object[] { new Long(
											param) });
								} else if (type.equals("boolean")
										|| type.equals("java.lang.Boolean")) {
									ms[i].invoke(result, new Object[] { Boolean
											.valueOf(param) });
								} else if (type.equals("java.util.Date")) {
									Date date = new Date(param);
									if (date != null)
										ms[i].invoke(result,
												new Object[] { date });
								}
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;

	}

   public static String getValueFromXML(String tagId, BaseController controller){
		Class<?> c;
		try {
			c = Class.forName(BaseController.packageName + ".R$id");
			Field f;
			f = c.getDeclaredField(tagId);
			int mainView = f.getInt(null);
			//TODO 此处可以加上多种控件的判断，未完待续
			Class clz =  controller.findViewById(mainView).getClass();
			if (clz.newInstance() instanceof EditText) {
				return ((EditText)clz.newInstance()).toString();
			}
			
		} catch (Exception e) {
			
		}
		return null;
   }
}
